'''
在Django REST framework (DRF)中，序列化和反序列化是两个核心概念，它们涉及到将复杂数据类型（如Django模型实例）转换为Python基本数据类型（通常是字典），
以及将这些基本数据类型转换回复杂数据类型的过程。
序列化（Serialization）
序列化是指将复杂数据类型（如Django模型实例）转换为Python基本数据类型（如字典或有序字典），这些基本数据类型可以轻松地转换为JSON、XML或其他格式，以便通过HTTP响应发送给客户端。

在DRF中，序列化通常是通过定义序列化器类（Serializer class）来完成的。序列化器类定义了如何将模型实例的字段转换为字典中的键值对。然后，你可以使用
序列化器的.data属性来获取这个字典，或者使用.serialize()方法（在旧版本中）来直接获取JSON字符串。

序列化：复杂模型实例->python基本数据类型->json
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
1、模型转换为字典：
    serializer = SnippetSerializer(snippet)
    serializer.data是一个字典，包含了序列化后的数据
2、字典（或其他python基本数据类型）转换为json
    content = JSONRenderer().render(serializer.data)

反序列化（Deserialization）
反序列化是指将接收到的客户端数据（通常是JSON或XML格式的字符串）转换为Python基本数据类型（如字典），然后再将这些基本数据类型转换回复杂数据类型（如Django模型实例）。

在DRF中，反序列化也是通过序列化器类来完成的。当你接收到客户端发送的数据时，你可以创建一个序列化器实例，并将数据作为data参数传递给它。然后，
你可以调用序列化器的.is_valid()方法来验证数据是否符合序列化器定义的字段和验证规则。如果数据有效，你可以使用.save()方法将数据保存为模型实例。

反序列化：json->python基本数据类型->复杂模型实例
import io
1、json转换为python基本数据类型：
    stream = io.BytesIO(content)
    data = JSONParser().parse(stream)  #这里就将json转换为了字典
2、python基本数据类型转换为复杂模型实例：
    deserializer = SnippetSerializer(data=data)
    deserializer.is_valid() #先调用序列化器实例的is_valid()方法，验证所接收的data的正确性
    deserializer.validated_data

其实deserializer = SnippetSerializer(data=serializer.data)也是可以的
'''

from rest_framework import serializers
from snippets.models import Snippet
from django.contrib.auth.models import User

class SnippetSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    class Meta:
        model = Snippet
        fields = ['id', 'title', 'code', 'linenos', 'language', 'style', 'owner']

class UserSerializer(serializers.ModelSerializer):
    snippets = serializers.PrimaryKeyRelatedField(many=True, queryset=Snippet.objects.all())
    class Meta:
        model = User
        fields = ['id', 'username', 'snippets']